package com.yict.csms.system.service;

import java.io.File;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.yict.common.service.IBaseService;
import com.yict.csms.system.dao.ICostDao;
import com.yict.csms.system.entity.BudgetNum;
import com.yict.csms.system.entity.Cost;
import com.yict.csms.system.entity.DataDict;
import com.yict.csms.system.entity.User;

public interface ICostService extends IBaseService<Cost, Long, ICostDao> {

	/**
	 * 查询服务日期是否在给定范围，及状态=给定的状态
	 * @param beginDate 开始日期
	 * @param endDate 结束日期
	 * @param dataDict 数据字典-计费状态
	 * @param dataDict 币种
	 * @return 存在，不存在
	 */
	boolean check(Date beginDate, Date endDate, DataDict dataDict, DataDict currency);

	/**
	 * 查询预算编号是否被引用
	 * @param budgetNum 预算编号
	 * @return 被引用，没有被引用
	 */
	boolean check(BudgetNum budgetNum);

	/**
	 * 
	 * @param companyid 公司的主键
	 * @param profeid 工种的主键
	 * @param stationid 岗位的主键
	 * @param formid 派更确认记录的主键
	 * @param accountmethod 计费方式字典主键，参见字典类型ACCOUNTMETHOD
	 * @param servicedate 服务日期即订更日期
	 * @param servicebegintime 开始时间，可以为null，如果为null则以该更次的开始时间为开始时间
	 * @param serviceendtime 结束时间，可以为null，如果为null则以该更次的结束时间为结束时间
	 * @param servicetime 更次字典主键
	 * @param deductworkhour 扣除工时的小时数。
	 * @param deductreason 扣除工时的原因
	 * @param quantity 数量，如果工种是按工作量计算的这里不为null值
	 * @param source 数据来源,数据字典主键，麻鹰/龙门吊派更/船舶操作/雪箱派更/人员订更/文件导入/录入，参看数据字典type为COST_SOURCE
	 * @return true 操作成功,否则操作失败
	 */
	public boolean createCost(Long companyid,Long profeid,
			Long stationid,Long formid,String accountmethod,
			Date servicedate,Date servicebegintime,Date serviceendtime,
			String servicetime,BigDecimal deductworkhour,
			String deductreason,BigDecimal quantity,
			String source,User us) throws Exception;
	
	/**
	 * 返还派更确认，
	 * 数据来源是来自船舶的计费不能取消，
	 * 数据来源是来自人员订更、麻鹰、龙门吊、雪箱的派更确认则删除计费记录，并将该派更记录状态改为已派更
	 * 来自麻鹰、龙门吊的记录要要将一次派更确认的记录一次返还，雪箱的数据要
	 * 其他数据来源则将状态改为未计费
	 * @param ids 计费记录主键
	 * @return true 操作成功，否则失败
	 * @throws Exception 数据来源是来自船舶
	 */
	public boolean rejectAccount(Long[] ids,User us) throws Exception;
	
	/**
	 * 取消计费，
	 * 只能对已计费并且是录入或者导入如的记录操作
	 * @param ids
	 * @return
	 * @throws Exception
	 */
	public boolean cancelAccount(Long[] ids,User us) throws Exception;
	
	/**
	 * 计费
	 * @param ids
	 * @return
	 * @throws Exception
	 */
	public boolean account(Long[] ids,User us) throws Exception;
	
	/**
	 * 确认计费
	 * @param ids
	 * @return
	 * @throws Exception
	 */
	public boolean confirmAccount(long[] ids,User us) throws Exception;
	
	/**
	 * 批量添加
	 * @param list
	 * @return
	 * @throws Exception
	 */
	public boolean save(List<Cost> list) throws Exception;
	
	/**
	 * 导入外部计费文件
	 * @param fileName
	 * @param validateFileName
	 * @return 导入记录数
	 * @throws Exception
	 */
	public int importCost(String fileName,String validateFileName) throws Exception;

	List<Cost> listForSheet(Map<String, Object> queryMap);
}
